// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
 * Author: Huawei OS Kernel Lab
 * Create: Thu Aug 15 16:14:23 2023
 */

#include <linux/types.h>
#include <linux/mmzone.h>
#include <linux/vm_event_item.h>
#include <linux/atomic.h>
#include <linux/static_key.h>
#include <linux/mm.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/vmstat.h>
#include <linux/math64.h>
#include <linux/mm_inline.h>
#include <liblinux/unimpl.h>

atomic_long_t vm_zone_stat[NR_VM_ZONE_STAT_ITEMS] __cacheline_aligned_in_smp;
EXPORT_SYMBOL(vm_zone_stat);
atomic_long_t vm_numa_stat[NR_VM_NUMA_STAT_ITEMS] __cacheline_aligned_in_smp;
EXPORT_SYMBOL(vm_numa_stat);
atomic_long_t vm_node_stat[NR_VM_NODE_STAT_ITEMS] __cacheline_aligned_in_smp;
EXPORT_SYMBOL(vm_node_stat);

void __mod_zone_page_state(struct zone *zone,
			   enum zone_stat_item item, long delta)
{
	zone_page_state_add(delta, zone, item);
}

void __mod_node_page_state(struct pglist_data *pgdat,
			   enum node_stat_item item, long delta)
{
	if (vmstat_item_in_bytes(item)) {
		VM_WARN_ON_ONCE(delta & (PAGE_SIZE - 1));
		delta >>= PAGE_SHIFT;
	}

	node_page_state_add(delta, pgdat, item);
}

void __inc_zone_state(struct zone *zone, enum zone_stat_item item)
{
	atomic_long_inc(&zone->vm_stat[item]);
	atomic_long_inc(&vm_zone_stat[item]);
}

void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item)
{
	atomic_long_inc(&pgdat->vm_stat[item]);
	atomic_long_inc(&vm_node_stat[item]);
}

void __dec_zone_state(struct zone *zone, enum zone_stat_item item)
{
	atomic_long_dec(&zone->vm_stat[item]);
	atomic_long_dec(&vm_zone_stat[item]);
}

void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item)
{
	atomic_long_dec(&pgdat->vm_stat[item]);
	atomic_long_dec(&vm_node_stat[item]);
}

void __inc_zone_page_state(struct page *page,
			   enum zone_stat_item item)
{
	__inc_zone_state(page_zone(page), item);
}

void __inc_node_page_state(struct page *page,
			   enum node_stat_item item)
{
	__inc_node_state(page_pgdat(page), item);
}

void __dec_zone_page_state(struct page *page,
			   enum zone_stat_item item)
{
	__dec_zone_state(page_zone(page), item);
}

void __dec_node_page_state(struct page *page,
			   enum node_stat_item item)
{
	__dec_node_state(page_pgdat(page), item);
}

void inc_zone_page_state(struct page *page,
			 enum zone_stat_item item)
{
	__inc_zone_page_state(page, item);
}

void dec_zone_page_state(struct page *page,
			 enum zone_stat_item item)
{
	__dec_zone_page_state(page, item);
}

void mod_zone_page_state(struct zone *zone,
			 enum zone_stat_item item, long delta)
{
	__mod_zone_page_state(zone, item, delta);
}

void inc_node_page_state(struct page *page,
			 enum node_stat_item item)
{
	__inc_node_page_state(page, item);
}

void dec_node_page_state(struct page *page,
			 enum node_stat_item item)
{
	__dec_node_page_state(page, item);
}

void mod_node_page_state(struct pglist_data *pgdat,
			 enum node_stat_item item, long delta)
{
	__mod_node_page_state(pgdat, item, delta);
}

void inc_zone_state(struct zone *zone, enum zone_stat_item item)
{
	__inc_zone_state(zone, item);
}

void inc_node_state(struct pglist_data *pgdat, enum node_stat_item item)
{
	__inc_node_state(pgdat, item);
}

void dec_zone_state(struct zone *zone, enum zone_stat_item item)
{
	__dec_zone_state(zone, item);
}
